#ifndef SQLPOOL_H
#define SQLPOOL_H

/*
基于单例模式，使用信号量实现一个连接池
*/

#include <queue>
#include <mysql/mysql.h>
#include <string>
#include "locker.h"

// 数据库配置信息
static std::string svr = "127.0.0.1";
static std::string usr = "root";
static std::string pwd = "123456";
static std::string db = "webserver";

// 给MYSQL*取个别名
typedef MYSQL* MYSQLPTR;

class SqlPool{
private:
    // 构造函数
    SqlPool();
    // 成员变量
    // MySQL连接队列
    std::queue<MYSQLPTR> m_sqlQueue;
    // 队列的大小
    int m_queueSize;
    // 单例模式的对象
    static SqlPool *obj;
    // 用于初始化连接的参数
    std::string m_server;
    std::string m_user;
    std::string m_password;
    std::string m_dbName;
    std::string m_mysqlPort;
    // 信号量
    Locker mutex, full, empty;
    // 连接池工作的状态
    bool isClose;
    // 成员函数
    
public:
    // 析构函数
    ~SqlPool();
    // 获取连接池的单例对象
    static SqlPool *getInstance();
    // 获取连接
    MYSQLPTR getConn();
    // 释放连接，归还给连接池
    void freeConn(MYSQLPTR connPtr);
};

#endif